#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define PORT 8080   /*端口号*/

int main() {
    int sock = 0;   /*存储套接字描述符,初始化*/
    struct sockaddr_in serv_addr;   /*定义了一个 sockaddr_in结构体变量 serv_addr，用于存储服务器地址信息*/
    char buffer[1024] = {0};   /*字符数组 buffer，长度为 1024，并初始化为全零。这个数组将用于存储从服务器接收的数据*/

    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {   /*调用 socket 函数创建一个 IPv4、面向连接的套接字（即 TCP 套接字）*/
        printf("\n Socket creation error \n");   /*返回值小于 0，则表示创建失败*/
        return -1;
    }

    serv_addr.sin_family = AF_INET;   /*设置 serv_addr 结构体的 sin_family 字段为 AF_INET，表示使用 IPv4 地址*/
    serv_addr.sin_port = htons(PORT);   /*设置 serv_addr 结构体的 sin_port 字段为通过 htons(PORT) 转换后的端口号。htons 函数将主机字节序转换为网络字节序*/

    if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {   /*将字符串形式的IP地址（"127.0.0.1"）转换为网络字节序的二进制形式，并存储在 serv_addr.sin_addr 中*/
        printf("\nInvalid address/ Address not supported \n");   /*返回值小于或等于 0，则表示转换失败*/
        return -1;
    }

    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {   /*调用 connect 函数尝试连接到 serv_addr 指定的服务器地址*/
        printf("\nConnection Failed \n");   /*返回值小于 0，则表示连接失败*/
        return -1;
    }

    while (1) {
        printf("Enter command (on/off/blink <interval>): ");   /*用户输入命令*/
        fgets(buffer, 1024, stdin);   /*从标准输入 (stdin) 读取最多 1024 个字符并存储到 buffer 中*/
        buffer[strcspn(buffer, "\n")] = 0;  // 去除换行符
        /*通过 strcspn 函数找到 buffer 中的换行符位置，并将其替换为字符串终止符 \0，这样就去除了用户输入中的换行符。*/

        send(sock, buffer, strlen(buffer), 0);   /*使用 send 函数将 buffer 中的内容通过套接字 sock 发送到服务器。strlen(buffer) 返回 buffer 的长度，作为发送的数据长度*/
        printf("Command sent: %s\n", buffer);
    }

    close(sock);
    return 0;
}/*程序结束*/